package com.kds.fxtool.config;

import com.kds.fxtool.controller.MainController;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class SceneManager {
    private static final Logger logger = LoggerFactory.getLogger(SceneManager.class);

    private static Stage primaryStage;
    private static Map<String, Object> controllers = new HashMap<>();

    private static double xOffset = 0;
    private static double yOffset = 0;
    private static boolean isMaximized = false;

    // 保存原始窗口位置和大小
    private static double originalX;
    private static double originalY;
    private static double originalWidth = 900;
    private static double originalHeight = 600;

    public static void setPrimaryStage(Stage stage) {
        primaryStage = stage;
        // 设置窗口无边框
        primaryStage.initStyle(StageStyle.TRANSPARENT);
    }

    /**
     * 切换到登录页面
     */
    public static void returnToLogin() {
        try {
            logger.info("切换到登录页面...");

            FXMLLoader loader = new FXMLLoader(SceneManager.class.getResource("/fxml/login.fxml"));
            Parent root = loader.load();

            // 保存控制器引用（如果需要）
            controllers.put("login", loader.getController());

            Scene scene = new Scene(root, originalWidth, originalHeight);
            scene.setFill(Color.TRANSPARENT); // 设置场景透明以支持圆角

            // 添加CSS样式
            scene.getStylesheets().add(SceneManager.class.getResource("/styles/login.css").toExternalForm());

            // 添加鼠标拖动支持
            setupDragHandlers(root);

            // 设置到主舞台
            primaryStage.setScene(scene);
            primaryStage.setTitle("智能管理系统 - 登录");

            // 居中显示
            primaryStage.centerOnScreen();

            // 确保窗口大小正确
            primaryStage.sizeToScene();

            // 确保窗口显示
            if (!primaryStage.isShowing()) {
                primaryStage.show();
            }

            logger.info("登录页面加载完成");
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("加载登录页面失败: " + e.getMessage());
        }
    }

    /**
     * 切换到主页面
     */
    public static void switchToMain() {
        try {
            logger.info("切换到主页面...");

            FXMLLoader loader = new FXMLLoader(SceneManager.class.getResource("/fxml/main.fxml"));
            Parent root = loader.load();

            MainController mainController = loader.getController();
            controllers.put("main", mainController);

            Scene scene = new Scene(root);
            scene.setFill(Color.TRANSPARENT);
            scene.getStylesheets().add(SceneManager.class.getResource("/styles/main.css").toExternalForm());

            setupDragHandlers(root);

            primaryStage.setScene(scene);
            primaryStage.setTitle("智能管理系统");
            primaryStage.centerOnScreen();
            primaryStage.sizeToScene();

            // 确保窗口显示
            primaryStage.show();
            logger.info("主页面加载完成");
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("加载主页面失败: " + e.getMessage());
            // 如果主页面加载失败，返回登录页
            returnToLogin();
        }
    }

    /**
     * 设置鼠标拖动处理
     */
    private static void setupDragHandlers(Parent root) {
        // 鼠标按下时记录当前位置
        root.setOnMousePressed((MouseEvent event) -> {
            xOffset = event.getSceneX();
            yOffset = event.getSceneY();
        });

        // 鼠标拖动时移动窗口
        root.setOnMouseDragged((MouseEvent event) -> {
            if (!primaryStage.isMaximized()) {
                primaryStage.setX(event.getScreenX() - xOffset);
                primaryStage.setY(event.getScreenY() - yOffset);
            }
        });
    }

    /**
     * 获取控制器
     */
    @SuppressWarnings("unchecked")
    public static <T> T getController(String name) {
        return (T) controllers.get(name);
    }

    /**
     * 显示窗口
     */
    public static void showStage() {
        if (primaryStage != null) {
            primaryStage.show();
        }
    }

    /**
     * 设置窗口标题
     */
    public static void setTitle(String title) {
        if (primaryStage != null) {
            primaryStage.setTitle(title);
        }
    }

    /**
     * 获取主舞台
     */
    public static Stage getPrimaryStage() {
        return primaryStage;
    }

    public static void showLoginScene() throws IOException {
        Parent root = ResourceManager.loadFXML(ResourceManager.LOGIN_FXML);
        ResourceManager.applyCSS(root, ResourceManager.LOGIN_CSS);

        // 创建透明场景
        Scene scene = new Scene(root, originalWidth, originalHeight);
        scene.setFill(Color.TRANSPARENT);

        // 设置无边框窗口
        primaryStage.initStyle(StageStyle.TRANSPARENT);

        // 添加窗口拖动功能
        makeWindowDraggable(root);

        // 设置窗口大小
        primaryStage.setScene(scene);
        primaryStage.setTitle("智能管理系统 - 登录");
        primaryStage.setResizable(false); // 保持不可调整大小以保持设计完整性

        // 居中显示
        primaryStage.centerOnScreen();
        primaryStage.show();

        // 保存初始位置
        originalX = primaryStage.getX();
        originalY = primaryStage.getY();
    }

    // 使窗口可拖动
    private static void makeWindowDraggable(Parent root) {
        root.setOnMousePressed(event -> {
            if (!isMaximized) {
                xOffset = event.getSceneX();
                yOffset = event.getSceneY();
            }
        });

        root.setOnMouseDragged(event -> {
            if (!isMaximized) {
                primaryStage.setX(event.getScreenX() - xOffset);
                primaryStage.setY(event.getScreenY() - yOffset);
            }
        });

        // 双击标题栏最大化/恢复
        root.setOnMouseClicked(event -> {
            if (event.getClickCount() == 2 && event.getTarget().toString().contains("title-bar")) {
                toggleMaximize();
            }
        });
    }

    // 切换最大化状态
    public static void toggleMaximize() {
        if (primaryStage == null) return;

        if (!isMaximized) {
            // 保存当前位置和大小
            originalX = primaryStage.getX();
            originalY = primaryStage.getY();
            originalWidth = primaryStage.getWidth();
            originalHeight = primaryStage.getHeight();

            // 获取屏幕尺寸
            javafx.geometry.Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();

            // 设置最大化
            primaryStage.setX(screenBounds.getMinX());
            primaryStage.setY(screenBounds.getMinY());
            primaryStage.setWidth(screenBounds.getWidth());
            primaryStage.setHeight(screenBounds.getHeight());

            isMaximized = true;
        } else {
            // 恢复原始大小和位置
            primaryStage.setX(originalX);
            primaryStage.setY(originalY);
            primaryStage.setWidth(originalWidth);
            primaryStage.setHeight(originalHeight);

            isMaximized = false;
        }
    }

    // 最大化窗口
    public static void maximizeWindow() {
        if (!isMaximized) {
            toggleMaximize();
        }
    }

    /**
     * 最大化/还原窗口
     */
    public static void toggleMaximizeWindow() {
        if (primaryStage != null) {
            if (primaryStage.isMaximized()) {
                primaryStage.setMaximized(false);
            } else {
                primaryStage.setMaximized(true);
            }
        }
    }

    // 恢复窗口
    public static void restoreWindow() {
        if (isMaximized) {
            toggleMaximize();
        }
    }

    // 最小化窗口
    public static void minimizeWindow() {
        if (primaryStage != null) {
            primaryStage.setIconified(true);
        }
    }

    // 关闭窗口
    public static void closeWindow() {
        if (primaryStage != null) {
            primaryStage.close();
        }
        System.exit(0); // 确保程序完全退出
    }

    // 获取最大化状态
    public static boolean isMaximized() {
        return isMaximized;
    }
}